home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / PowerD / powerd / source / lib / chunky_lib.lha / Chunky / GetPixel32Smooth.ass < prev    next >
Encoding:
Text File  |  2001-01-04  |  3.2 KB  |  169 lines

  1.  
  2. ; GetPixel32Smooth(chunky:a0:PTR TO chunky,x:fp0:FLOAT,y:fp1:FLOAT)(LONG)
  3.  
  4.     machine    mc68020
  5.     fpu    1
  6.  
  7.     xdef    _GetPixel32Smooth
  8.  
  9. _GetPixel32Smooth
  10.     fmovem.x    fp2-fp3,-(a7)
  11.     movem.l    d2-d6,-(a7)
  12.     cmpa.l    #0,a0
  13.     beq.w    .out
  14.     ftst.x    fp0
  15.     fblt.w    .out
  16.     ftst.x    fp1
  17.     fblt.w    .out
  18.     fcmp.l    (a0),fp0
  19.     fbge.w    .out
  20.     fcmp.l    (4,a0),fp1
  21.     fbge.w    .out
  22.  
  23. ; fp0 and fp1 are float positions in the chunky and we want to get an exact
  24. ; interpolated value of the colour
  25.     fmove.l    fp0,d0        ; get integer x and y
  26.     fmove.l    fp1,d1
  27.     fsub.l    d0,fp0        ; get the difference (0.0..1.0)
  28.     fsub.l    d1,fp1
  29.  
  30.     muls.l    (a0),d3
  31.     add.l    d0,d3
  32.     lsl.l    #2,d3        ; d1 now contains position in buffer
  33.     movea.l    (8,a0),a1
  34.     move.l    (0,a1,d3.l),d0    ; x,y
  35.     move.l    (1,a1,d3.l),d1    ; x+1,y
  36.     add.l    (a0),d3
  37.     move.l    (-1,a1,d3.l),d2    ; x,y+1
  38.     move.l    (0,a1,d3.l),d3    ; x+1,y+1
  39. ; here we got four colours:
  40. ;d0*--*d1
  41. ;  |  |
  42. ;d2*--*d3
  43.     move.l    d0,d4
  44.     bsr    UnPack32
  45.     movem.l    d1-d3,-(a7)
  46.     movem.l    d4-d6,-(a7)
  47.     move.l    d1,d4
  48.     bsr    UnPack32
  49.     movem.l    (a7)+,d1-d3    ; now I have d1,d2,d3 as colour x+1,y and d4,d5,d6 as colour x,y
  50.  
  51.     fmove.l    d4,fp3        ; red
  52.     fmove.w    #1,fp2
  53.     fsub    fp0,fp2
  54.     fmul    fp2,fp3        ; fp3:=a*(1-t)
  55.     fmove.l    d1,fp2
  56.     fmul    fp0,fp2        ; fp2:=b*t
  57.     fadd    fp3,fp2
  58.     fmove.l    fp2,d4        ; a:=a*(1-t)+b*t
  59.  
  60.     fmove.l    d5,fp3        ; green
  61.     fmove.w    #1,fp2
  62.     fsub    fp0,fp2
  63.     fmul    fp2,fp3        ; fp3:=a*(1-t)
  64.     fmove.l    d2,fp2
  65.     fmul    fp0,fp2        ; fp2:=b*t
  66.     fadd    fp3,fp2
  67.     fmove.l    fp2,d5        ; a:=a*(1-t)+b*t
  68.  
  69.     fmove.l    d6,fp3        ; blue
  70.     fmove.w    #1,fp2
  71.     fsub    fp0,fp2
  72.     fmul    fp2,fp3        ; fp3:=a*(1-t)
  73.     fmove.l    d3,fp2
  74.     fmul    fp0,fp2        ; fp2:=b*t
  75.     fadd    fp3,fp2
  76.     fmove.l    fp2,d6        ; a:=a*(1-t)+b*t
  77.  
  78.     movem.l    (a7)+,d1-d3    ; restore old values
  79.     movem.l    d4-d6,-(a7)    ; store first colour
  80.  
  81.     move.l    d2,d4
  82.     bsr    UnPack32
  83.     movem.l    d4-d6,-(a7)
  84.     move.l    d3,d4
  85.     bsr    UnPack32
  86.     movem.l    (a7)+,d1-d3    ; now I have d1,d2,d3 as colour x+1,y and d4,d5,d6 as colour x,y
  87.  
  88.     fmove.l    d4,fp3        ; red
  89.     fmove.w    #1,fp2
  90.     fsub    fp0,fp2
  91.     fmul    fp2,fp3        ; fp3:=a*(1-t)
  92.     fmove.l    d1,fp2
  93.     fmul    fp0,fp2        ; fp2:=b*t
  94.     fadd    fp3,fp2
  95.     fmove.l    fp2,d4        ; a:=a*(1-t)+b*t
  96.  
  97.     fmove.l    d5,fp3        ; green
  98.     fmove.w    #1,fp2
  99.     fsub    fp0,fp2
  100.     fmul    fp2,fp3        ; fp3:=a*(1-t)
  101.     fmove.l    d2,fp2
  102.     fmul    fp0,fp2        ; fp2:=b*t
  103.     fadd    fp3,fp2
  104.     fmove.l    fp2,d5        ; a:=a*(1-t)+b*t
  105.  
  106.     fmove.l    d6,fp3        ; blue
  107.     fmove.w    #1,fp2
  108.     fsub    fp0,fp2
  109.     fmul    fp2,fp3        ; fp3:=a*(1-t)
  110.     fmove.l    d3,fp2
  111.     fmul    fp0,fp2        ; fp2:=b*t
  112.     fadd    fp3,fp2
  113.     fmove.l    fp2,d6        ; a:=a*(1-t)+b*t
  114.  
  115.     movem.l    (a7)+,d1-d3    ; restore first colour (from d4,d5,d6)
  116.  
  117.     fmove.l    d4,fp3        ; red
  118.     fmove.w    #1,fp2
  119.     fsub    fp0,fp2
  120.     fmul    fp2,fp3        ; fp3:=a*(1-t)
  121.     fmove.l    d1,fp2
  122.     fmul    fp0,fp2        ; fp2:=b*t
  123.     fadd    fp3,fp2
  124.     fmove.l    fp2,d1        ; b:=a*(1-t)+b*t
  125.  
  126.     fmove.l    d5,fp3        ; green
  127.     fmove.w    #1,fp2
  128.     fsub    fp0,fp2
  129.     fmul    fp2,fp3        ; fp3:=a*(1-t)
  130.     fmove.l    d2,fp2
  131.     fmul    fp0,fp2        ; fp2:=b*t
  132.     fadd    fp3,fp2
  133.     fmove.l    fp2,d2        ; b:=a*(1-t)+b*t
  134.  
  135.     fmove.l    d6,fp3        ; blue
  136.     fmove.w    #1,fp2
  137.     fsub    fp0,fp2
  138.     fmul    fp2,fp3        ; fp3:=a*(1-t)
  139.     fmove.l    d3,fp2
  140.     fmul    fp0,fp2        ; fp2:=b*t
  141.     fadd    fp3,fp2
  142.     fmove.l    fp2,d3        ; b:=a*(1-t)+b*t
  143.  
  144.     moveq    #0,d0
  145.     swap    d1    ; 00rr0000
  146.     lsl    #8,d2    ; 0000gg00
  147.     or.l    d1,d0
  148.     or.l    d2,d0
  149.     or.l    d3,d0    ; 00rrggbb
  150.  
  151.     movem.l    (a7)+,d2-d6
  152.     fmovem.x    (a7)+,fp2-fp3
  153.     rts
  154. .out    moveq    #-1,d0
  155.     movem.l    (a7)+,d2-d6
  156.     fmovem.x    (a7)+,fp2-fp3
  157.     rts
  158.  
  159. ; UnPack32(d4:UL)(d4:L,d5:L,d6:L)
  160. UnPack32
  161.     clr.l    d5
  162.     move.b    d4,d6
  163.     lsr.l    #8,d4
  164.     clr.l    d5
  165.     move.b    d4,d5
  166.     lsr.l    #8,d4
  167.     andi.l    #$ff,d4    ; clear alpha
  168.     rts
  169.